/*
 * @文件描述:片上ADC初始化、采集等参数设置模块
 * @版本:
 * @作者: 周晨阳
 * @Date: 2021-01-15 23:46:33
 */
#ifndef ADC_H
#define ADC_H
#include "ADC_Conditioning.h"
#ifndef WIN_SIM
#include "stm32f4xx.h"
#include "public.h"

//外部触发的模式
//单次触发，在触发一次后就不会再触发
#define SAMLPING_TRIG_ONCE 1
//连续触发，在每一个边沿都触发
#define SAMLPING_TRIG_CONTINUOUS 2

//adc采样器的状态
//正在采样，
#define ADC_STATE_SAMPLING 0
//adc处于空闲状态，完全停止采样
#define ADC_STATE_IDLE 1
//adc处于hold状态（此状态下仍会继续采样，但不会更新validbuffer数据，以达到hold功能）
#define ADC_STATE_HOLD 2
//正在处理数据
#define ADC_STATE_PROCESSING 3

#define BUFFER_0 2
#define BUFFER_1 1

#define TRIG_TYPE_RISING 0
#define TRIG_TYPE_FALLING 1

#define MODE_MULTIMETER 1
#define MODE_OSCILL 0
#ifndef WIN_SIM
/****以下宏不是通用宏，放在这里是方便更改，如果需要更改硬件这些宏不需要复制****/
//STM32F407专用宏定义
//ADC通道
#define ADC_CHANNEL ADC_Channel_13
#define ADC1_2_CHANNEL_GPIO_CLK RCC_AHB1Periph_GPIOC
#define ADC_GPIO_PIN GPIO_Pin_3
#define ADC_GPIO_PORT GPIOC
#define ADC_DMA_CHANNELx DMA_Channel_0
#define ADC_DMA_STREAMx DMA2_Stream0
//adc外部触发引脚
//只能为PX11，不能为其他,X可以是A,B,C...
#define ADC_TRIG_PIN GPIO_Pin_11
#define ADC_TRIG_PORT GPIOF
#define ADC_TRIG_CLK RCC_AHB1Periph_GPIOF
#define ADC_EXIT_PORT EXTI_PortSourceGPIOF
/*************************/
//以下是万用表应用用到的ADC引脚定义，可以是三个表用同一个IO
//电压表ADC的GPIO引脚
//使用哪一个adc频道，统一使用adc2
// adc频道所在的引脚pin和port，查询手册可得知是PC4
#define VOLTAGE_ADC_CHANNEL ADC_Channel_14
#define VOLTAGE_ADC_GPIO_PIN GPIO_Pin_4
#define VOLTAGE_ADC_GPIO_PORT GPIOC
#define VOLTAGE_ADC_GPIO_CLK RCC_APB2Periph_GPIOC

//欧姆表ADC的GPIO引脚
//使用哪一个adc频道
#define RESISTANCE_ADC_CHANNEL ADC_Channel_14
#define RESISTANCE_ADC_GPIO_PIN GPIO_Pin_4
#define RESISTANCE_ADC_GPIO_PORT GPIOC
#define RESISTANCE_ADC_GPIO_CLK RCC_APB2Periph_GPIOC

//电流表ADC的GPIO引脚
//使用哪一个adc频道，统一使用adc2
#define CURRENT_ADC_CHANNEL ADC_Channel_14
#define CURRENT_ADC_GPIO_PIN GPIO_Pin_4
#define CURRENT_ADC_GPIO_PORT GPIOC
#define CURRENT_ADC_GPIO_CLK RCC_APB2Periph_GPIOC
#endif
void setADC_Buffer(uint8_t whichBuffer, uint32_t add, uint32_t bufferSize);
void setTriggerBuffer(uint32_t add, uint32_t bufferSize);
uint32_t getTriggerEventCnt(void);
void setBufferCount(uint8_t count);
void setValidBuffer(uint16_t *add, uint32_t size);
uint32_t getValidBufferSize(void);
uint32_t getADC_BufferAdd(uint8_t whichBuffer);
uint32_t getADC_BufferSize(uint8_t whichBuffer);
void setSampleFinishCB(void (*callback)(uint8_t, uint32_t));
uint8_t getSampleState(void);
void setHoldState(uint8_t state);
void setADCTrigType(uint8_t trigType);
uint8_t getADC2_State();
uint8_t getCurrentReadyBuf(void);

void pauseADC_Sampling(void);
void resumeADC_Sampling(void);
void closeADC(void);
void changeADCBufferSize(uint32_t size);
uint32_t getCurrentADCSamplingRateValue(void);
void setTriggerCounter(uint32_t *counter);
uint32_t getLastADCSamplingRateValue(void);
void setADCxCallbackFun(uint8_t ADCx, void (*cb)(uint16_t));

void DMA2_Stream0_IRQHandler(void);

/*******以下函数不是通用的函数，如果需要更改硬件，这5个函数可能不需要*****/
//STM32F407专用函数
void setAll_ADC_SamplingTime(uint8_t channel, uint8_t time);
void setAll_ADC_SampTimeAndPrescale(uint8_t prescale, uint8_t time);
void setADC_Prescaler(uint32_t scaler);
void setDMABufferSize(uint16_t size);
void getCurrentDMABufferSize(void);
void My_ADC_init(uint8_t mode);
void MultiMeter_ADC_Start();
void MultiMeter_ADC_Stop();
// void MultiMeter_ADCx_Init_auto(ADC_TypeDef *ADCx, char channel);
void ResistanceADC_GPIO_Init();
void VoltageADC_GPIO_Init();
void CurrentADC_GPIO_Init();
/********************/
#else
/*
 * @文件描述:片上ADC初始化、采集等参数设置模块
 * @版本:
 * @作者: 周晨阳
 * @Date: 2021-01-15 23:46:33
 */
#include "ADC_Conditioning.h"
#include "public.h"

//外部触发的模式
//单次触发，在触发一次后就不会再触发
#define SAMLPING_TRIG_ONCE 1
//连续触发，在每一个边沿都触发
#define SAMLPING_TRIG_CONTINUOUS 2

//adc采样器的状态
//正在采样，
#define ADC_STATE_SAMPLING 0
//adc处于空闲状态，完全停止采样
#define ADC_STATE_IDLE 1
//adc处于hold状态（此状态下仍会继续采样，但不会更新validbuffer数据，以达到hold功能）
#define ADC_STATE_HOLD 2
//正在处理数据
#define ADC_STATE_PROCESSING 3

#define BUFFER_0 2
#define BUFFER_1 1

#define TRIG_TYPE_RISING 0
#define TRIG_TYPE_FALLING 1

#define MODE_MULTIMETER 1
#define MODE_OSCILL 0
/****以下宏不是通用宏，放在这里是方便更改，如果需要更改硬件这些宏不需要复制****/
// //STM32F407专用宏定义
// //ADC通道
// #define ADC_CHANNEL ADC_Channel_13
// #define ADC1_2_CHANNEL_GPIO_CLK RCC_AHB1Periph_GPIOC
// #define ADC_GPIO_PIN GPIO_Pin_3
// #define ADC_GPIO_PORT GPIOC
// #define ADC_DMA_CHANNELx DMA_Channel_0
// #define ADC_DMA_STREAMx DMA2_Stream0
// //adc外部触发引脚
// //只能为PX11，不能为其他,X可以是A,B,C...
// #define ADC_TRIG_PIN GPIO_Pin_11
// #define ADC_TRIG_PORT GPIOF
// #define ADC_TRIG_CLK RCC_AHB1Periph_GPIOF
// #define ADC_EXIT_PORT EXTI_PortSourceGPIOF
// /*************************/
// //以下是万用表应用用到的ADC引脚定义，可以是三个表用同一个IO
// //电压表ADC的GPIO引脚
// //使用哪一个adc频道，统一使用adc2
// // adc频道所在的引脚pin和port，查询手册可得知是PC4
// #define VOLTAGE_ADC_CHANNEL ADC_Channel_14
// #define VOLTAGE_ADC_GPIO_PIN GPIO_Pin_4
// #define VOLTAGE_ADC_GPIO_PORT GPIOC
// #define VOLTAGE_ADC_GPIO_CLK RCC_APB2Periph_GPIOC

// //欧姆表ADC的GPIO引脚
// //使用哪一个adc频道
// #define RESISTANCE_ADC_CHANNEL ADC_Channel_14
// #define RESISTANCE_ADC_GPIO_PIN GPIO_Pin_4
// #define RESISTANCE_ADC_GPIO_PORT GPIOC
// #define RESISTANCE_ADC_GPIO_CLK RCC_APB2Periph_GPIOC

// //电流表ADC的GPIO引脚
// //使用哪一个adc频道，统一使用adc2
// #define CURRENT_ADC_CHANNEL ADC_Channel_14
// #define CURRENT_ADC_GPIO_PIN GPIO_Pin_4
// #define CURRENT_ADC_GPIO_PORT GPIOC
// #define CURRENT_ADC_GPIO_CLK RCC_APB2Periph_GPIOC

void setADC_Buffer(uint8_t whichBuffer, uint32_t add, uint32_t bufferSize);
void setTriggerBuffer(uint32_t add, uint32_t bufferSize);
uint32_t getTriggerEventCnt(void);
void setBufferCount(uint8_t count);
void setValidBuffer(uint16_t *add, uint32_t size);
uint32_t getValidBufferSize(void);
uint32_t getADC_BufferAdd(uint8_t whichBuffer);
uint32_t getADC_BufferSize(uint8_t whichBuffer);
void setSampleFinishCB(void (*callback)(uint8_t, uint32_t));
uint8_t getSampleState(void);
void setHoldState(uint8_t state);
void setADCTrigType(uint8_t trigType);
uint8_t getADC2_State();
uint8_t getCurrentReadyBuf(void);

void pauseADC_Sampling(void);
void resumeADC_Sampling(void);
void closeADC(void);
void changeADCBufferSize(uint32_t size);
uint32_t getCurrentADCSamplingRateValue(void);
void setTriggerCounter(uint32_t *counter);
uint32_t getLastADCSamplingRateValue(void);
void setADCxCallbackFun(uint8_t ADCx, void (*cb)(uint16_t));

void DMA2_Stream0_IRQHandler(void);

/*******以下函数不是通用的函数，如果需要更改硬件，这5个函数可能不需要*****/
//STM32F407专用函数
void setAll_ADC_SamplingTime(uint8_t channel, uint8_t time);
void setAll_ADC_SampTimeAndPrescale(uint8_t prescale, uint8_t time);
void setADC_Prescaler(uint32_t scaler);
void setDMABufferSize(uint16_t size);
void getCurrentDMABufferSize(void);
void My_ADC_init(uint8_t mode);
void MultiMeter_ADC_Start();
void MultiMeter_ADC_Stop();
// void MultiMeter_ADCx_Init_auto(ADC_TypeDef *ADCx, char channel);
void ResistanceADC_GPIO_Init();
void VoltageADC_GPIO_Init();
void CurrentADC_GPIO_Init();
/********************/
#endif
#endif
